from flask import request, jsonify,Response, make_response
from aps import app
import time
from aps.models.usuario import *
from aps.models.item import *
from aps.models.proyectofase import *
from aps.models.historial import *
from reportlab.pdfgen import canvas
from reportlab.lib.units import cm
import webbrowser

@app.route('/consultar_historial', methods=['GET', 'POST'])  
def consultar_historial():
    """
    Nos permite traer las entradas en el historial para un item, fase o proyecto
    los itemes que cumplen con la condicion del filtro.
    @param request: objeto que encapsula la peticion del cliente
    @return: si la accion se realizo correctamente
    """
    id_proyecto = request.args['idproyecto']
    id_fase     = request.args['idfase']
    id_item     = request.args['iditem']
    # Especificamos una sentencia para obtener los registros
    sentencia   = 'SELECT * from historial WHERE {0}={1} order by fecha DESC, hora DESC'
    if int(id_proyecto)+int(id_fase)+int(id_item) == int(id_proyecto):
        sentencia = sentencia.format('idproyecto',id_proyecto)
    elif int(id_proyecto)+int(id_fase)+int(id_item) == int(id_fase):
        sentencia = sentencia.format('idfase',id_fase)
    else:
        sentencia = sentencia.format('iditem',id_item)
    # Obtenemos los registros de historial
    entradas = bdsession.query(Historial).from_statement(sentencia).all()
    data = []
    for entrada in entradas:
        item = {}
        item['idproyecto'] = entrada.idproyecto
        item['proyecto']   = entrada.proyecto.nombre
        item['idfase']     = entrada.idfase
        item['fase']       = entrada.fase.nombre
        item['iditem']     = entrada.iditem
        item['item']       = entrada.item.nombre
        item['fecha']      = str(entrada.fecha)
        item['hora']       = str(entrada.hora)
        item['idusuario']  = entrada.idusuario
        item['nombre']     = entrada.usuario.nombres
        item['apellido']   = entrada.usuario.apellidos
        item['mensaje']    = entrada.mensaje
        data.append(item)
    
    return jsonify ({'success':True, 'data':data, 'total':len(data)})
    
def log_it(iditem,user_nick,mensaje='mensaje por defecto'):
    """
    Nos permite crear una entrada en el historial
    @param iditem: id de item.
    @param user_nick: nick del usuario autenticado.
    @param mensaje: mensaje del registro.
    @return: None
    """
    item     = bdsession.query(Item).filter_by(id=iditem).first()
    usuario  = bdsession.query(Usuario).filter_by(nick=user_nick).first()
    proyecto = bdsession.query(ProyectoFase).filter_by(idfase=item.idfase).first().proyecto
    t        = time.localtime()
    fecha    = str(t.tm_year) + '-' + str(t.tm_mon).zfill(2) + '-' + str(t.tm_mday).zfill(2)
    hora     = str(t.tm_hour).zfill(2) + ':' + str(t.tm_min).zfill(2) + ':' + str(t.tm_sec).zfill(2)
    # Creamos el registro y almacenamos en la BD
    model    = Historial(proyecto.id,item.idfase,item.id,usuario.id,fecha,hora,mensaje)
    bdsession.add(model)
    
#*****************
@app.route('/crear_pdf', methods=['GET', 'POST'])  
def crear_pdf():
    id_proyecto = request.form['idproyecto']
    id_fase     = request.form['idfase']
    id_item     = request.form['iditem'] 
    
    # Especificamos una sentencia para obtener los registros
    sentencia   = 'SELECT * from historial WHERE {0}={1} order by fecha DESC, hora DESC'
    if int(id_proyecto)+int(id_fase)+int(id_item) == int(id_proyecto):
        sentencia = sentencia.format('idproyecto',id_proyecto)
    elif int(id_proyecto)+int(id_fase)+int(id_item) == int(id_fase):
        sentencia = sentencia.format('idfase',id_fase)
    else:
        sentencia = sentencia.format('iditem',id_item)
    #Crea el nombre del informe en pdf
    nombrepdf = '/tmp/'+"proy"+id_proyecto +"_fase"+ id_fase +"_iditem"+ id_item+".pdf"
    nombre ="proy"+id_proyecto +"_fase"+ id_fase +"_iditem"+ id_item+".pdf"
    c = canvas.Canvas(nombrepdf)
    c.setTitle("Historial de Items")
    c.setFont("Helvetica-Bold", 10)
    c.drawString(1*cm, 29*cm,"Historial de Items")
    a = 26
    band = True
    
    # Obtenemos los registros de historial
    entradas = bdsession.query(Historial).from_statement(sentencia).all()
    data = []
    for entrada in entradas:     
        item = {}
        item['idproyecto'] = entrada.idproyecto
        item['proyecto']   = entrada.proyecto.nombre
        item['idfase']     = entrada.idfase
        item['fase']       = entrada.fase.nombre
        item['iditem']     = entrada.iditem
        item['item']       = entrada.item.nombre
        
        item['fecha']      = str(entrada.fecha)
        item['hora']       = str(entrada.hora)
        item['idusuario']  = entrada.idusuario
        item['nombre']     = entrada.usuario.nombres
        item['apellido']   = entrada.usuario.apellidos
        item['mensaje']    = entrada.mensaje
        
        if band == True:
            c.setFont("Helvetica-Bold", 10)
            c.drawString(1*cm, 29*cm,"Historial de Items")
            c.line(1*cm,28.5*cm,19*cm,28.5*cm)
            c.line(1*cm,26.5*cm,19*cm,26.5*cm)
            c.drawString(1*cm, 28*cm, "Id Proyecto: "+str(item['idproyecto'])+"    -    Nombre de Proyecto: "+item['proyecto'])
            c.drawString(1*cm, 27.5*cm, "Id Fase: "+ str(item['idfase'])+"    -    Nombre de Fase: "+item['fase'])
            c.drawString(1*cm, 27*cm, "Id Item: "+ str(item['iditem'])+"    -    Nombre del Item: "+item['item'])
            c.getPageNumber()
            c.setFont("Helvetica", 10)
            band = False
            
        c.setFont("Helvetica-Bold", 10)
        escribir = "Fecha: "+item['fecha']+" Hora: "+item['hora']+" Usuario: "+str(item['idusuario']) +" Nombre: "+item['nombre']+" " +item['apellido']
        c.drawString(1*cm, a*cm, escribir)
        a = a - 0.5
        c.setFont("Helvetica", 10)
        escribir = item['mensaje']
        c.drawString(1*cm, a*cm, escribir)
        a = a - 1
        
        if a < 2.5:
            a = 25
            c.showPage()
            band = True
    c.save()
    
    response = make_response()
    response.headers['Content-Type'] = 'application/pdf'
    response.headers['Content-Disposition'] = 'filename='+ nombrepdf
    response.headers['Cache-Control'] = 'no-cache'
    
   
    f = open(nombrepdf, 'r')
    response.headers['Content-Length'] = str(f.__sizeof__())
    response.data=f.read()
    webbrowser.open(nombrepdf)
    return response

